package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象----实现序列化接口Serializable：功能：将对象转换为二进制
 *                            版本号：一定要写，对象写出，对象读入，必须统一版本号
 * ObjectOutputStream     对象输出流    写出---Person.java
 * ObjectInputStream      对象输入流    读入---Person.java
 * */
public class ObjectIO {

    //需求：将Person.java文件编程对象 写出---序列化操作

    /**
     * ObjectOutputStream 对象输出流/序列化
     */
    @Test
    public void testOOS()  {
        //传输对象：创建实现序列化接口的对象
        Person p=new Person();
        p.setNames("韩");
        //String[] say=new String[]{}
        // 字符串数组：动态数组传输---给定元素决定数组长度
        p.setSay(new String[]{"百因必有果"});

        //传输符合条件对象---输出流---xxx.obj 文件是一种对象文件保存格式
       // System.out.println(p);
        //创建低级流---写出   对象格式：person.obj
        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        try {
            fos=new FileOutputStream("person.obj");
            oos=new ObjectOutputStream(fos);
            String line = null;
            oos.writeObject(p);
        }catch (FileNotFoundException e) {//文件不存在异常
            e.printStackTrace();
        }catch (UnsupportedEncodingException e) {//编码集异常
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (oos != null)
                    oos.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("写出成功");
            }
        }


     //   FileOutputStream fos=new FileOutputStream("person.obj");
        //高级流：ObjectOutputStream
    //    ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)---写出对象
         * 作用：将给定对象按照其结构进行转换，转换为一组"组"字节，
         *      在通过处理的流写出，写出格式：xxx.obj
         *
         * 抛出异常：NotSerializableException 没有实现序列化接口
         * 原因：传输对象没有实现Serializable序列化接口
         *
         * Person 类--去掉序列化接口；Serializable
         *
         * 对象文件写出操作需要经过2个步骤：(专业术语)
         * 1.通过对象输出流将Person类，转换为一组"组"字节，这个过程对象序列化
         * 2.将序列化后的字节在通过字节流（低级流）写出到项目中（硬盘上）做长久
         *   的保存，这个过程：数据持久化！
         */



    }

    /**
     * ObjectInputStream 对象输入流/反序列化
     * 反序列化---二进制转换为对象
     *
     * InvalidClassException   反序列化出现异常：版本号不匹配
     *
     * ClassNotFoundException  没有这个类型的异常
     * 产生原因：读入对象不正确，永久保存数据，类型读入不对
     *                 person1.class  person.obj
     *                 person2.class
     */
    @Test
    public void testOIS()  {
        //创建输入流---person.obj---读入
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        try {
            fis=new FileInputStream("person.obj");
            ois=new ObjectInputStream(fis);
            String line = null;
            System.out.println(ois.readObject());
        } catch (IOException e) {//文件不存在异常
            e.printStackTrace();
        } catch (ClassCastException e) {//编码集异常
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(ois!=null);
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //     FileInputStream fis=new FileInputStream("person.obj");
        //创建高级流---对象输入流
  //      ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject() 返回读取的对象，反序列化操作

    }
}
